package main

import (
	"fmt"
	"reflect"
)

func main(){
	//reflect 提供了2个重要函数：

	//ValueOf()：获取变量的值，即pair中的 value
	//TypeOf()：获取变量的类型，即pair中的 concrete type
	type Person struct {
		Name string
		Age int
	}
	p := Person{ "lisi", 13}

	fmt.Println(reflect.ValueOf(p))			// {lisi 13}  变量的值
	fmt.Println(reflect.ValueOf(p).Type())	// main.Person 变量类型的对象名

	fmt.Println(reflect.TypeOf(p))			//  main.Person	变量类型的对象名

	fmt.Println(reflect.TypeOf(p).Name())	// Person:变量类型对象的类型名
	fmt.Println(reflect.TypeOf(p).Kind())	// struct:变量类型对象的种类名

	fmt.Println(reflect.TypeOf(p).Name() == "Person")	// true
	fmt.Println(reflect.TypeOf(p).Kind() == reflect.Struct)	//true

	//类型与种类的区别：

	//Type是原生数据类型： int、string、bool、float32 ，以及 type 定义的类型，对应的反射获取方法是 reflect.Type 中 的 Name()
	//Kind是对象归属的品种：Int、Bool、Float32、Chan、String、Struct、Ptr（指针）、Map、Interface、Fune、Array、Slice、Unsafe Pointer等
}